package com.chandon.T03_method_reference;

import com.chandon.common.Cv;
import com.chandon.T03_method_reference.function.ConstrutorFunction;

import java.util.function.BiFunction;
import java.util.function.Supplier;

/**
 * 构造方法引用  类名::new
 * 对应lambda表达式为  () -> new Object();
 * <p>
 * 如果一个函数式接口的实现(lambda表达式)，可以通过一个类的构造方法实现，就可以使用构造方法引用。
 * 人话：某个类的构造方法，实现了某个函数功能，可以简写为lambda表达式，又可再次简写为方法引用。
 *
 * 构造方法的引用：方法看成对象，
 *
 * 构造方法返回一个实例，需要用可接收返回值的函数接口
 *
 * @author Dong
 * @version 1.0
 * @date 2021-04-15 16:18
 */

public class T00_ConstrutorMethodRef {
    public static void main(String[] args) {

       /*
          无参构造引用没有参数
          函数式接口Supplier<T>的 T get(T t)
       */
        Supplier<Cv> cvConstrutorSupplier = Cv::new;
        Cv cv = cvConstrutorSupplier.get();
        // 对应lambda
        Supplier<Cv> cvConstrutorSupplierLambda = () -> new Cv();
        Cv cv1 = cvConstrutorSupplierLambda.get();


        // 有参数构造函数引用，
        BiFunction<String, Integer, Cv> cvBiFunction = Cv::new;
        // 对应Lambda
        BiFunction<String, Integer, Cv> cvBiFunctionLambda = (name, age) -> new Cv(name, age);
        Cv cv2 = cvBiFunction.apply("asamiyui", 18);
        System.out.println(cv2);


        // 自定义函数接口ConstrutorInterface 多参数构造
        ConstrutorFunction<String, Integer, Integer, Cv> cvConstrutorFunction = Cv::new;
        // 对应lambda
        ConstrutorFunction<String, Integer, Integer, Cv> cvConstrutorFunctionLambda = (name, age, scope) -> {
            return new Cv("asamiyui", 17, 10);
        };
        Cv asamiyui = cvConstrutorFunction.getInstance("asamiyui", 17, 10);
        System.out.println(asamiyui);


    }

}
